package com.xuecheng.content.service.impl;

import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.model.dto.CourseCategoryTreeDto;
import com.xuecheng.content.service.CourseCategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Author: Ren(任佳宝)
 * @Description: CourseBaseInfoServiceImpl
 * @Date: 2024/8/15 下午5:03
 * @Version: 1.0
 */
@Slf4j
@Service
public class CourseCategoryServiceImpl implements CourseCategoryService {


    @Resource
    private CourseCategoryMapper courseCategoryMapper;

    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {

        List<CourseCategoryTreeDto> nodes = courseCategoryMapper.selectTreeNodes(id);

        // 找到每个结点的子节点，最终封装成List<CourseCategoryTreeDto>
        // 先将list转成map,key就是结点的Id,value就是CourseCategoryTreeDto对象,目的就是为了方便从map获取结点
        Map<String, CourseCategoryTreeDto> mapTemp = nodes
                .stream()
                .filter(item -> !id.equals(item.getId()))
                .collect(Collectors.toMap(key -> key.getId(), value -> value, (key1, key2) -> key2));

        // 最终返回的
        ArrayList<CourseCategoryTreeDto> courseCategoryList = new ArrayList<>();
        // 从头遍历 List<CourseCategoryTreeDto>, 一边遍历一边找子节点放在父结点childrenTreeNodes
        nodes.stream()
                .filter(item -> !id.equals(item.getId()))
                .forEach(item -> {
                    if (item.getParentid().equals(id)) {
                        // 放第一级的结点
                        courseCategoryList.add(item);
                    }
                    // 当前节点的父节点
                    CourseCategoryTreeDto courseCategoryParent = mapTemp.get(item.getParentid());
                    // 父结点不为null
                    if (courseCategoryParent != null) {
                        // 如果父节点的孩子结点为null就new一个集合,放孩子结点
                        if (courseCategoryParent.getChildrenTreeNodes() == null) {
                            courseCategoryParent.setChildrenTreeNodes(new ArrayList<CourseCategoryTreeDto>());
                        }
                        // 找到每个结点的子节点放在父节点的childrenTreeNodes属性中
                        courseCategoryParent.getChildrenTreeNodes().add(item);
                    }
                });

        return courseCategoryList;
    }
}
